import java.util.Objects;

public class TestDemo {

    //Java中只有按值传递
    public static void swap(int x, int y){
        int tmp = x;
        x = y;
        y = tmp;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        swap(a, b);
        System.out.println("a = " + a + ",b = " + b);
    }
    //方法重载(overload)
    //方法不能完全一样，同名但不同参数类型、参数个数，返回值无所谓
    public static int add(int a, int b){
        return a + b;
    }
    public static double add(double a, double b){
        return a + b;
    }
    public static double add(double a, double b, double c){
        return a + b + c;
    }

    //来点练习：
    //1.求斐波那契数列的第n项。(迭代实现)
    public static int fib(int n){
        int[] a = new int[100];
        a[0] = 0;
        a[1] = 1;
        for (int i = 2; i < 20; i++) {
            a[i] = a[i - 1] + a[i - 2];
        }
        return a[n - 1];
    }
    public static void main1(String[] args) {
        int n = 5;
        System.out.println(fib(5));
    }

    //2.有一组数据，只有一个数字是出现一次，其他是两次，请找出这个数字。
    public static int find(int[] a){
        int ret = 0;
        for (int i = 0; i < a.length; i++) {
            int count = 0;
            for (int j = 0; j < a.length; j++) {
                if (a[i] == a[j]) {
                    count++;
                }
            }
            if (count == 1){
                ret = i;
            }
        }
        return ret;
    }
    public static int find_1(int[] a){
        int ret = a[0];
        for (int i = 1; i < a.length; i++) {
            ret = ret ^ a[i];
        }
        return ret;
    }
    public static void main2(String[] args) {
        int[] a = {1, 2, 2, 3, 1};
        int b = find_1(a);
        System.out.println(b);
    }

    //3.求 N 的阶乘
    public static int fac(int n){
        int sum = 1;
        for (int i = 1; i <= n; i++) {
            sum *= i;
        }
        return sum;
    }
    public static void main3(String[] args) {
        System.out.println(fac(5));
    }

    //4.求1！+2！+3！+4！+........+n!的和
    public static int facSum1(int n){
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += fac(i);
        }
        return sum;
    }
    public static void main4(String[] args) {
        System.out.println(facSum1(5));
    }

    //5.调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
    public static void swapArr(int[] a){
        int z = 0;
        for (int i = 0; i < a.length; i++) {
            if (a[i] % 2 != 0){
                int tmp = a[i];
                a[i] = a[z];
                a[z] = tmp;
                z++;
            }
        }
    }
    public static void swapArr_1(int[] a){
        int left = 0;
        int right = a.length - 1;
        while (left < right){
            while(left < right && a[left] % 2 != 0){
                left++;//把左边偶数取出
            }
            while (left < right && a[right] % 2 == 0){
                right--;//把右边奇数取出
            }
            int tmp = a[left];
            a[left] = a[right];
            a[right] = tmp;
        }
    }
    public static void main5(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        swapArr_1(a);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

    /*7.创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算*/
    public static int twoMax(int m, int n){
        return m > n ? m : n;
    }
    public static int threeMax(int a, int b, int c){
        return twoMax(a, c) > b ? twoMax(a, c) : b;
    }

    /*8.在同一个类中定义多个方法：要求不仅可以求两个整数的最大值，
    还可以求两个小数的最大值，以及两个小数和一个整数的大小关系（重载）*/
    public static int findMax(int m, int n){
        return m > n ? m : n;
    }
    public static double findMax(double m, double n){
        return m > n ? m : n;
    }
    public static int findMax(double m, int n){
        return m > n ? (int)m : n;
    }

    //9.在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。（重载）
    public static int addSum(int m, int n){
        return m + n;
    }
    public static double addSum(double a, double b, double c){
        return a + b + c;
    }

}
